package redis

import (
	"context"
	"fmt"
	"time"

	"gitee.com/klein-x/biz/module/db/redis"
	v8 "github.com/go-redis/redis/v8"
)

const timeout = time.Minute * 5
const blTimeout = time.Minute * 10
const blCount = 10

func InCaptchaBlackList(ctx context.Context, phone string) error {
	key := "chaptch_bl" + phone
	count, err := redis.RedisDB.Get(ctx, key).Int() // 键不存在返回 0和v8.nil
	if err != nil && err != v8.Nil {
		return fmt.Errorf("操作redis失败,%v", err)
	}

	if count > blCount {
		return fmt.Errorf("获取验证码过于频繁,暂时无法获取")
	}

	// 更新计数
	count++
	if count == 1 {
		// 如果是第一次访问，设置键的初始值为1，并设置超时时间为10分钟
		_, err := redis.RedisDB.Set(ctx, key, count, blTimeout).Result()
		if err != nil {
			return fmt.Errorf("操作redis失败, %v", err)
		}
	} else {
		// 如果键已存在，更新键的值，但不改变超时时间
		if err := redis.RedisDB.Set(ctx, key, count, v8.KeepTTL).Err(); err != nil {
			return fmt.Errorf("操作redis失败, %v", err)
		}
	}
	return nil
}

func SetCaptcha(ctx context.Context, phone, captcha string) error {
	// 更新验证码同时重新设置验证码时间
	if err := redis.RedisDB.Set(ctx, phone, captcha, timeout).Err(); err != nil {
		return fmt.Errorf("操作redis失败,%v", err)
	}
	return nil
}

func ValidateCaptcha(ctx context.Context, phone, captcha string) error {
	val, err := redis.RedisDB.Get(ctx, phone).Result()
	if err != nil && err != v8.Nil {
		return fmt.Errorf("操作redis失败,%v", err)
	}
	if captcha != val {
		return fmt.Errorf("验证码错误")
	}
	// 如果校验成功则删除验证码
	delErr := redis.RedisDB.Del(ctx, phone).Err()
	if delErr != nil && delErr != v8.Nil {
		return fmt.Errorf("删除验证码失败: %w", delErr)
	}
	return nil
}

// func GetCaptcha(ctx context.Context, phone string) (string, error) {
// 	val, err := redis.RedisDB.Get(ctx, phone).Result()
// 	if err != nil && err != v8.Nil {
// 		return "", fmt.Errorf("操作redis失败,%v", err)
// 	}
// 	return val, nil
// }
